package cn.xkai.exercise.a;

/**
 * @description: 外观数列
 * 给定一个正整数 n ，输出外观数列的第 n 项。
 * 「外观数列」是一个整数序列，从数字 1 开始，序列中的每一项都是对前一项的描述。
 * <p>
 * 自己的思路：循环n-1次+双指针之快慢指针读数
 * 借鉴的思路：递归+双指针
 * 心得：双指针的用法还不够精简
 * @author: kaixiang
 * @date: 2022-07-06
 **/
public class Solution36 {
    public String countAndSay(int n) {
        String num = "1";
        while (n > 1) {
            int len = num.length();
            StringBuilder sb = new StringBuilder();
            int left = 0, right = 0;
            while (left < len){
                char c = num.charAt(left);
                right = left + 1;
                while (right < len && num.charAt(right) == c) {
                    right++;
                }
                sb.append(right - left).append(c);
                left = right;
            }
            num = sb.toString();
            n--;
        }
        return num;
    }

    public String countAndSayRefer(int n) {
        // 递归出口
        if (n == 1) {
            return "1";
        }
        // 假设我们获得上一次的结果为 s1 = 112213
        String s1 = countAndSayRefer(n - 1);
        // 定义结果
        StringBuilder result = new StringBuilder();
        // 对s1遍历处理获取值
        char local = s1.charAt(0);
        int count = 0;
        for (int i = 0; i < s1.length(); i++) {
            // 设定计数器 计算同一个数字出现的次数 count
            if (s1.charAt(i) == local) {
                count++;
            } else {
                // 不符合，记录下
                result.append(count);
                result.append(local);
                count = 1;
                local = s1.charAt(i);
            }
        }
        result.append(count);
        result.append(local);
        return result.toString();
    }

    public static void main(String[] args) {
        int n = 4;
        Solution36 solution36 = new Solution36();
        System.out.println(solution36.countAndSay(n));
        System.out.println(solution36.countAndSayRefer(n));
    }
}
